const fs = require('fs/promises')
const path = require('path')

const jsonPath = path.resolve(__dirname, './data/hero.json')

// 获取数据 array
async function getList () {
  const res = await fs.readFile(jsonPath)
  const list = JSON.parse(res.toString())
  return list
}

// 获取列表
// 查询参数 q
async function query (q) {
  // 1. 获取数据
  const list = await getList()
  // 2. 筛选数据
  if (q === undefined) {
    return list
  } else {
    const _list = list.filter(function (v) {
      return v.name.includes(q) // true / false
    })
    return _list
  }
}

async function add ({ name, icon }) {
  if (!name || !icon) {
    return Promise.reject('name或icon不能为空')
  }
  // 1. 获取数据
  const list = await getList()
  // 2. 添加数据 id用时间戳
  list.push({
    id: Date.now(),
    name,
    icon
  })
  // 3. 保存到 json中 为了让外部可以等待执行结果
  return fs.writeFile(jsonPath, JSON.stringify(list))
}

// 删除
// 根据id删除
async function del (id) {
  if (!id) {
    return Promise.reject('id不能为空')
  }
  // 1. 获取列表
  const list = await getList()
  // 2. 删除数据 filter 筛选出 id不相同的数据 true / false
  // 简化写法
  const _list = list.filter(v => v.id !== id)
  // 写会到 json文件
  return fs.writeFile(jsonPath, JSON.stringify(_list))
}

// 修改
// 参数是对象 对象有 id,name,,icon属性
async function update ({ id, name, icon }) {
  if (!name || !icon || !id) {
    return Promise.reject('name或icon或id不能为空')
  }
  // 1. 获取列表
  const list = await getList()
  // 2. 找到要更改的数据
  list.forEach(v => {
    if (v.id === id) {
      // 找到了
      // 3. 修改数据
      v.name = name
      v.icon = icon
    }
  })

  // 4.保存回json文件中
  return fs.writeFile(jsonPath, JSON.stringify(list))
}
// 重置方法
// 先分析一步一步做什么
// 考虑每一步如何实现
async function reset () {
  // 1. 读取_hero.json
  const _heroPath = path.join(__dirname, './data/_hero.json')
  const res = await fs.readFile(_heroPath)
  const heroData = JSON.parse(res.toString())
  // 2. 写入到 hero.json
  fs.writeFile(jsonPath, JSON.stringify(heroData))
}

module.exports = {
  query,
  add,
  update,
  del,
  reset
}
